home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / PRG / JUEGOS / CHECKOUT.PRG < prev    next >
Encoding:
Text File  |  1997-12-01  |  46.2 KB  |  1,128 lines

  1.  
  2. //-----------------------------------------------------------------------------
  3. // TITULO: CHECK OUT
  4. // AUTOR:  DANIEL NAVARRO MEDRANO
  5. // FECHA:  01/09/96
  6. //-----------------------------------------------------------------------------
  7.  
  8. PROGRAM Checkout;
  9.  
  10. CONST
  11.     pieza_jugador=42;   // Valor de las piezas del jugador
  12.     pieza_ordenador=50; // Valor de las piezas del ordenador
  13.     no_pieza=36;        // Indica cuando no hay ninguna pieza
  14.     prof_min=3;         // Profundidad mínima de búsqueda
  15.  
  16. GLOBAL
  17.  
  18.     fichero1,fichero2;  // Identificadores de los ficheros de grßficos
  19.     letras1;            // Letras para los mensajes durante el juego
  20.     letras2,letras3,letras4,letras5,letras6;
  21.     finaljuego=0;       // Controla cuando se acaba el juego
  22.     quiengana=0;        // Sirve para determinar quien gana el juego
  23.     seleccionada;       // Indica que pieza se selecciona con el ratón
  24.     que_pieza;          // Indica que pieza se va a mover
  25.     mover;              // Indica hacia donde se va a mover la pieza
  26.     nivel_actual;       // Nivel de dificultad 1 (f cil), 2, 3, ...
  27.     color;              // Quién juega abajo 0-Blancas / 3-Negras
  28.     mueve;              // Indica quién mueve 1-Jugador / 2-Ordenador
  29.     quienhaganado;
  30.     tablero[35];        // Tablero de juego 6x6 posiciones (0..35)
  31.  
  32.     estrategia1[35];    // Estrategia que sigue el jugador superior
  33.     estrategia2[35];    // Estrategia que sigue el jugador inferior
  34.  
  35.     niveles[]=          // Colocacion de las piezas en los diferentes niveles
  36.  
  37.           2,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0,
  38.           0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,1,  // Nivel 0
  39.  
  40.           0,2,2,0,0,0, 2,0,2,0,0,0, 2,2,0,0,0,0,
  41.           0,0,0,0,1,1, 0,0,0,1,0,1, 0,0,0,1,1,0,  // Nivel 1
  42.  
  43.           2,2,2,0,0,0, 2,0,2,0,0,0, 2,2,0,0,0,0,
  44.           0,0,0,0,1,1, 0,0,0,1,0,1, 0,0,0,1,1,1,  // Nivel 2
  45.  
  46.           2,2,2,0,0,0, 2,2,2,0,0,0, 2,2,0,0,0,0,
  47.           0,0,0,0,1,1, 0,0,0,1,1,1, 0,0,0,1,1,1,  // Nivel 3
  48.  
  49.           2,2,2,2,0,0, 2,0,2,0,0,0, 2,2,0,0,0,1,
  50.           2,0,0,0,1,1, 0,0,0,1,0,1, 0,0,1,1,1,1,  // Nivel 4
  51.  
  52.           2,2,2,2,0,0, 2,2,2,0,0,0, 2,2,0,0,0,1,
  53.           2,0,0,0,1,1, 0,0,0,1,1,1, 0,0,1,1,1,1;  // Nivel 5
  54.  
  55.     estrategia[]=   // Estrategias de juego para los diferentes niveles
  56.  
  57.        3072,133,33,12,08,04, // Nivel 1
  58.          133,33,10,06,02,00,
  59.           33,10,04,01,01,02,
  60.           12,06,01,00,05,08,
  61.           08,02,01,05,05,20,
  62.           04,00,02,08,20,30,
  63.  
  64.        4096,256,40,20,08,04, // Nivel 2
  65.          256,40,20,06,02,08,
  66.           40,20,04,10,04,10,
  67.           20,06,10,06,08,20,
  68.           08,02,04,08,30,40,
  69.           04,08,10,20,40,75,
  70.  
  71.         4096,80,40,20,10,10, // Nivel 3
  72.           80,40,20,10,05,05,
  73.           40,20,10,05,10,10,
  74.           20,10,05,10,20,20,
  75.           10,05,10,20,40,40,
  76.           10,05,10,20,40,75,
  77.  
  78.         5096,60,20,10,08,08, // Nivel 4
  79.           60,20,10,08,05,05,
  80.           20,10,08,05,10,10,
  81.           10,08,05,10,20,20,
  82.           08,05,10,20,40,40,
  83.           08,05,10,20,40,75,
  84.  
  85.         6096,40,20,10,08,08, // Nivel 5
  86.           40,20,10,08,05,05,
  87.           20,10,08,05,10,10,
  88.           10,08,05,10,20,20,
  89.           08,05,10,20,40,40,
  90.           08,05,10,20,40,75;
  91.  
  92.     id_piezas=0;        // Identificador del proceso que crea las piezas
  93.     puntuación;         // Puntuación obtenida por una jugada
  94.  
  95.     parpadeo;           // Controla el parpadeo de la pieza seleccionada
  96.     opción;             // opción seleccionada en el menú (0 Jugar, 1 Salir)
  97.  
  98. LOCAL
  99.     // Contadores de uso general
  100.     contador_mov;       // Sirve de contador de movimientos
  101.     tipo_movimiento;    // Señala el tipo de movimiento a realizar
  102.     inc_desplazamiento; // Incremento parcial en los desplazamientos de piezas
  103.     mejor_movimiento;   // Guarda el mejor movimiento posible
  104.     columna_tablero;    // Señala la columna del tablero
  105.     tipo_pieza;         // Indica el tipo de pieza
  106.     fila_pieza;         // Indica la fila de la pieza
  107.     columna_pieza;      // Indica la columna de la pieza
  108.     cuentapausa;        // Sirve para contar la pausa del final
  109.     textos1;            // Identificador de textos
  110.  
  111.     num_mov;            // Numero de movimientos encontrados
  112.     tmovimientos[3*20]= 60 dup (0); // Por cada movimiento se indica (pieza,lado,puntuación)
  113.     lado;               // Lado que se esta  evaluando
  114.     num_nivel;          // Indica el número de nivel
  115.     contador_filas;     // Contador de filas
  116.     contador_columna;   // Contador de columnas
  117.     profundidad;        // Profundidad a explorar en cada proceso piensa()
  118.     nivel;              // Nivel de profundidad en el que est  cada proceso piensa()
  119.     num_casilla;        // Indica el número de casilla en bucles
  120.     num_piezas;         // Indica el número de piezas
  121.  
  122. BEGIN
  123.  
  124.     max_process_time=3000;          // Se pone el tiempo de proceso a 30 segundos
  125.                                     // para que el programa tenga tiempo de pensar
  126.     inicialización();               // Inicializa el juego
  127.  
  128.     REPEAT
  129.         menu_opciones();            // Pone el menu de opciones
  130.         WHILE (son) FRAME; END      // Espera a que se acabe con el menu de opciones
  131.         SWITCH (opción)             // Mira que eleccion se ha hecho
  132.             CASE 0:                 // Jugar
  133.                 control_juego();    // Empieza la partida
  134.                 WHILE (son)         // Repite mientras se este jugando
  135.                     IF (key(_esc))  // Si se pulsa la tecla escape sale del juego
  136.                         let_me_alone();     // Elimina cualquier proceso
  137.                         fade_off();         // Apaga la pantalla
  138.                         clear_screen();     // Borra la pantalla y cualquier texto
  139.                         delete_text(all_text); // Borra los texto que hubiera
  140.                     ELSE
  141.                         FRAME;
  142.                     END
  143.                 END
  144.             END
  145.             CASE 2:     // Instruccions
  146.                 instrucciones();
  147.                 WHILE (son) FRAME; END
  148.             END
  149.         END
  150.     UNTIL (opción==1)   // Salir del programa
  151.     creditos();
  152. END
  153.  
  154. //-----------------------------------------------------------------------------
  155. // Proceso inicialización
  156. // Inicializa el modo de vídeo y carga los ficheros de gr ficos y fuentes
  157. //-----------------------------------------------------------------------------
  158.  
  159. PROCESS inicialización()
  160.  
  161. BEGIN
  162.     // Selecciona el modo de video y los frames por segundo
  163.     set_mode(m640x480);
  164.     set_fps(32,4);
  165.  
  166.     // Carga los ficheros de graficos
  167.     fichero1=load_fpg("checkout\checkout.fpg");
  168.     fichero2=load_fpg("checkout\checkmnu.fpg");
  169.  
  170.     // Carga los ficheros de letras
  171.     letras1=load_fnt("checkout\check.fnt");
  172.     letras2=load_fnt("checkout\checkmn2.fnt");
  173.     letras3=load_fnt("checkout\checkmnu.fnt");
  174.     letras4=load_fnt("checkout\checkmn3.fnt");
  175.     letras5=load_fnt("checkout\checkgam.fnt");
  176.     letras6=load_fnt("checkout\checkgm2.fnt");
  177. END
  178.  
  179. //-----------------------------------------------------------------------------
  180. // Proceso menu_opciones
  181. // Maneja todo el menú de opciones
  182. //-----------------------------------------------------------------------------
  183.  
  184. PROCESS menu_opciones()
  185.  
  186. BEGIN
  187.     // Carga la paleta apropiada y pone el fondo de pantalla
  188.     load_pal("checkout\checkmnu.fpg"):
  189.     put_screen(1,1);
  190.  
  191.     fade_on();
  192.  
  193.     // Escribe los mensajes
  194.     write(letras2,320,-16,1,"CHECKOUT");
  195.     write(letras3,320,64,1,"El juego de ordenador");
  196.     write(letras3,320,390,1,"Empezar  Instrucciones  Salir");
  197.  
  198.     // Pone la barra negra de debajo de las opciones
  199.     xput(1,2,320,420,0,100,4,0);
  200.  
  201.     // Elige el grafico del ratón
  202.     mouse.file=fichero2;
  203.     mouse.graph=4;
  204.  
  205.     // Repite hasta que se coga una opción
  206.     opción=-1;
  207.     WHILE (opción<0)
  208.  
  209.         // Si se pulsa la tecla escape se sale del programa
  210.         IF (key(_esc)) opción=1; END
  211.  
  212.         // Si se pulsa espacio o enter, empieza el juego
  213.         IF (key(_space) OR key(_enter)) opción=0; END
  214.  
  215.         // Mira si se pulsado el raton por la parte baja de la pantalla
  216.         IF (mouse.left AND mouse.y>370)
  217.             // Mira en que parte y pon la opción elegida
  218.             IF (mouse.x<214)
  219.                 opción=0;
  220.             ELSE
  221.                 IF (mouse.x>426)
  222.                     opción=1;
  223.                 ELSE
  224.                     opción=2;
  225.                 END
  226.             END
  227.         END
  228.         FRAME;
  229.     END
  230.  
  231.     // Se apaga la pantalla, se borra todo y se sale del proceso
  232.     fade_off();
  233.     clear_screen();
  234.     delete_text(all_text);
  235.     nivel_actual=1;
  236. END
  237.  
  238. //-----------------------------------------------------------------------------
  239. // Proceso creditos
  240. // Muestra los créditos del programa
  241. //-----------------------------------------------------------------------------
  242.  
  243. PROCESS creditos()
  244.  
  245. BEGIN
  246.  
  247.     // Pone la pantalla de fondo
  248.     put_screen(1,3);
  249.     fade_on();
  250.  
  251.     // Pone los textos de los creditos
  252.     write(letras4,320,0,1,"Programa por:");
  253.     write(letras3,320,20,1,"Daniel Navarro");
  254.     write(letras4,320,80,1,"Idea original:");
  255.     write(letras3,320,100,1,"Luis F. Fernández");
  256.     write(letras4,320,160,1,"Gráficos:");
  257.     write(letras3,320,180,1,"M. Jesús Recio");
  258.     write(letras3,320,220,1,"Pablo de la Sierra");
  259.     write(letras3,320,260,1,"J. Ricardo Avella");
  260.  
  261.     // Pone el grafico del raton
  262.     mouse.file=fichero2;
  263.     mouse.graph=4;
  264.  
  265.     // Repite hasta que se pulse escape o un boton del ratón
  266.     scan_code=0;
  267.     REPEAT
  268.         FRAME;
  269.     UNTIL (mouse.right OR mouse.left OR scan_code<>0)
  270.     let_me_alone();
  271.  
  272. END
  273.  
  274. //-----------------------------------------------------------------------------
  275. // Proceso instrucciones
  276. // Muestra las instrucciones del juego
  277. //-----------------------------------------------------------------------------
  278.  
  279. PROCESS instrucciones()
  280.  
  281. BEGIN
  282.     // Pone el grafico en pantalla
  283.     put_screen(fichero2,5);
  284.     fade_on();
  285.  
  286.     // Repite hasta que se pulse escape o un boton del ratón
  287.     REPEAT
  288.         FRAME;
  289.     UNTIL (mouse.right OR key(_esc) OR mouse.left)
  290.  
  291.     // Apaga y borra la pantalla, borra cualquier texto, y devuelve el grafico al ratón
  292.     fade_off();
  293.     clear_screen();
  294.     delete_text(all_text);
  295. END
  296.  
  297. //-----------------------------------------------------------------------------
  298. // Proceso control_juego
  299. // Bucle principal de control del juego
  300. //-----------------------------------------------------------------------------
  301.  
  302. PROCESS control_juego()
  303.  
  304. PRIVATE
  305.     idmov;           // Identificador para obtener los movimientos
  306.     mov_posibles;    // Número de movimientos que puede hacer una pieza
  307.  
  308. BEGIN
  309.     // Carga la paleta del juego y pone la pantalla
  310.     load_pal("checkout\checkout.fpg");
  311.     put_screen(0,100);
  312.     fade_on();
  313.  
  314.     // Elige el grafico del raton
  315.     mouse.file=fichero1;
  316.     mouse.graph=4;
  317.     finaljuego=0;
  318.  
  319.     REPEAT  // Repite hasta que se acabe el juego
  320.  
  321.         // Pone la pantalla de fondo
  322.         put_screen(0,100);
  323.  
  324.         //Pone la variable de quien ha ganado a 0
  325.         quiengana=0;
  326.  
  327.         REPEAT  // Repite hasta que se acabe la partida
  328.  
  329.             // Pon el tablero de seleccion de pieza
  330.             pon_nivel(0);
  331.             color=0;
  332.             id_piezas=piezas();
  333.  
  334.             // Escribe los mensajes explicativos
  335.             write(letras1,320,28,4,"Use el raton para elegir bando");
  336.             write(letras1,290,48,4,"Nivel :");
  337.             write_int(letras1,366,48,4,&nivel_actual);
  338.             num_mov=2*3; // Determina como posibles elecciones las piezas blanca y negra
  339.             tmovimientos[0]=0;
  340.             tmovimientos[3]=35;
  341.             que_pieza=no_pieza;
  342.  
  343.             REPEAT      // Repite hasta que se elija un color
  344.                 signal(id_piezas,s_kill_tree);  // Borra las piezas antiguas
  345.                 id_piezas=piezas();             // Crea piezas nuevas
  346.                 FRAME;
  347.             UNTIL (mouse.left!=0 AND seleccionada!=no_pieza)
  348.  
  349.             // Mira que seleccion se ha elegido
  350.             IF (seleccionada==0)
  351.                 color=3; mueve=2; // Se eligieron negras, comienza el ordenador
  352.             ELSE
  353.                 color=0; mueve=1; // Se eligieron blancas, comienza el jugador
  354.             END
  355.             fade_off();
  356.  
  357.             // Inicio de la partida
  358.             pon_nivel(nivel_actual);        // Carga el nivel actual
  359.             signal(id_piezas,s_kill_tree);  // Borra las piezas viejas
  360.             id_piezas=piezas();             // Crea las nuevas piezas
  361.             delete_text(all_text);          // Borra cualquier texto en pantalla
  362.  
  363.             // Carga la estragia del nivel (pesos de cada casilla)
  364.             FROM num_casilla=0 TO 35;
  365.                 estrategia1[num_casilla]=estrategia[num_casilla]+rand(0,5)-2;
  366.                 estrategia2[35-num_casilla]=estrategia[num_casilla]+rand(0,5)-2; // Espeja la estrategia
  367.             END
  368.             fade_on();
  369.  
  370.             REPEAT  // Repite hasta que gane alguien
  371.                 SWITCH (mueve)
  372.                     CASE 1: // Cuando mueve el jugador ...
  373.                         que_pieza=no_pieza;
  374.                         idmov=piensa(0,mueve,1); // Se mira que posibilidades tiene el jugador
  375.                         num_mov=idmov.num_mov;
  376.                         FROM contador_mov=0 TO 59;
  377.                             tmovimientos[contador_mov]=idmov.tmovimientos[contador_mov];
  378.                         END
  379.                         IF (que_pieza!=no_pieza) // Si tiene al menos un movimiento ...
  380.                             REPEAT  // Repite hasta que gane la partida
  381.                                 delete_text(all_text);          // Borra cualquier texto
  382.  
  383.                                 // Pone los texto explicativos y el grafico del raton
  384.                                 write(letras1,320,28,4,"Por favor, elija su pieza");
  385.                                 mouse.file=fichero1;
  386.                                 mouse.graph=4;
  387.  
  388.                                 // En principio no hay seleccionada ninguna ficha
  389.                                 que_pieza=no_pieza;
  390.                                 signal(id_piezas,s_kill_tree);      // Borra piezas antiguos
  391.                                 id_piezas=piezas();                 // Crea fichas nuevas
  392.  
  393.                                 // El jugador selecciona la pieza a mover (aunque solo haya una)
  394.                                 REPEAT
  395.                                     signal(id_piezas,s_kill_tree);  // Borra piezas antiguos
  396.                                     id_piezas=piezas();             // Crea fichas nuevas
  397.                                     FRAME;
  398.                                 // Repite hasta que se selecciona una ficha
  399.                                 UNTIL (mouse.left!=0 AND seleccionada!=no_pieza)
  400.                                 que_pieza=seleccionada;
  401.  
  402.                                 // Ahora el jugador debe seleccionar que movimiento quiere hacer
  403.                                 delete_text(all_text);          // Borra cualquier texto que hubiera
  404.  
  405.                                 // Escribe textos explicativos
  406.                                 write(letras1,320,28,4,"Por favor, elija su movimiento");
  407.                                 parpadeo=0;
  408.                                 REPEAT
  409.                                     // Hace parpadear a la ficha
  410.                                     IF (parpadeo==1) parpadeo=0; ELSE parpadeo=1; END
  411.                                     signal(id_piezas,s_kill_tree);  // Borra piezas viejas
  412.                                     id_piezas=piezas();             // Crea piezas nuevas
  413.                                     FRAME;
  414.                                 // Espera hasta elegir un movimiento o deseleccionar la pieza
  415.                                 UNTIL ((mouse.left!=0 AND seleccionada!=no_pieza) || mouse.right==1)
  416.  
  417.                             UNTIL (mouse.right!=1)
  418.                             mover=seleccionada;
  419.  
  420.                             // Realiza el movimiento seleccionado
  421.                             tipo_pieza=tablero[que_pieza];
  422.                             movimiento();
  423.                             WHILE (tablero[mover]!=tipo_pieza) FRAME; END  // Espera a acabar el movimiento
  424.                         END
  425.                     END
  426.  
  427.                     CASE 2: // Cuando mueve el ordenador ...
  428.                         delete_text(all_text);  // Borra cualquier texto
  429.  
  430.                         // Pone los textos explicativos y el grafico del raton
  431.                         write(letras1,320,28,4,"Por favor espere... Estoy pensando");
  432.                         mouse.graph=0;
  433.                         que_pieza=no_pieza;
  434.                         signal(id_piezas,s_kill_tree);  // Borra piezas viejas
  435.                         id_piezas=piezas();             // Crea piezas nuevas
  436.  
  437.                         FRAME;                          // Para que se vea el texto mientras piensa
  438.                         piensa(prof_min,mueve,1);       // Piensa que jugada es menos
  439.  
  440.                         // Si se encontró un movimiento lo realiza
  441.                         IF (que_pieza!=no_pieza)
  442.                             tipo_pieza=tablero[que_pieza];
  443.                             movimiento();
  444.                             WHILE (tablero[mover]!=tipo_pieza) FRAME; END  // Espera ha realizar movimiento
  445.                         END
  446.                     END
  447.                 END
  448.  
  449.             // Se juega hasta que un oponente coloque una pieza en
  450.             // la diagonal contraria, o bien no pueda mover
  451.             UNTIL (tablero[0]==1 OR tablero[35]==2 OR que_pieza==no_pieza)
  452.  
  453.             // Decide quien de los dos ha ganado
  454.             IF (tablero[0]==1) quiengana=1;END
  455.             IF (tablero[35]==2) quiengana=2; END
  456.             IF (que_pieza==no_pieza)
  457.                 IF (mueve==1) quiengana=2; END
  458.                 IF (mueve==2) quiengana=1; END
  459.             END
  460.         UNTIL (quiengana<>0)
  461.         // Final de la partida
  462.  
  463.         // Borra textos explicativos anteriores
  464.         delete_text(all_text);
  465.  
  466.         // Pone los textos explicativos y el grafico del raton
  467.         write(letras1,320,28,4,"Fin del juego");
  468.         write(letras1,320,48,4,"Presione el boton del raton");
  469.         mouse.file=fichero1;
  470.         mouse.graph=4;
  471.         que_pieza=no_pieza;
  472.         num_mov=0;
  473.  
  474.         // Espera a que se pulse el raton o una tecla
  475.         scan_code=0; cuentapausa=0;
  476.         REPEAT
  477.             signal(id_piezas,s_kill_tree);  // Borra piezas viejas
  478.             id_piezas=piezas();             // Crea piezas nuevas
  479.             ++cuentapausa;
  480.             FRAME;
  481.         UNTIL (mouse.left OR mouse.right OR scan_code<>0 OR cuentapausa>100)
  482.  
  483.  
  484.         // Borra la pantalla, el cualquier texto o pieza que hubiera
  485.         fade_off();
  486.         clear_screen();
  487.         delete_text(all_text);
  488.         signal(id_piezas,s_kill_tree);
  489.         fade_on();
  490.  
  491.         // Comprueba quien ha ganado
  492.         // Si ha ganado el jugador
  493.         IF (quiengana==1)
  494.             IF (nivel_actual+1<6)   // Se sube un nivel si se puede
  495.                 nivel_actual++;
  496.             ELSE
  497.                 finaljuego=2;       // Y si no prepara para el mensaje de felicitacion
  498.             END
  499.         END
  500.  
  501.         // Si ha ganado el ordenador
  502.         IF (quiengana==2)
  503.             IF (nivel_actual-1>0)   // Se baja un nivel si se puede
  504.                 nivel_actual--;
  505.             ELSE
  506.                 finaljuego=1;       // Y si no se prepara el final del juego
  507.             END
  508.         END
  509.     UNTIL (finaljuego>0)
  510.  
  511.     // Pone la pantalla de fondo
  512.     put_screen(0,100);
  513.  
  514.     // Comprueba si se ha hecho todo o ha acabado el juego
  515.     IF (finaljuego==1)  // Ha finalizado el juego por haber perdido
  516.         textos1=write(letras5,320,500,4,"FIN DEL JUEGO");
  517.     ELSE                // Ha finalizado el juego por hacer todos los niveles
  518.         textos1=write(letras5,320,500,4,"GANASTES !");
  519.     END
  520.  
  521.     // Espera hasta que se pulse el raton o alguna tecla
  522.     scan_code=0; cuentapausa=500;
  523.     REPEAT
  524.         cuentapausa-=2;
  525.         if (cuentapausa>239) move_text(textos1,320,cuentapausa); END
  526.         FRAME;
  527.     UNTIL (mouse.left OR mouse.right OR scan_code<>0 OR cuentapausa<201)
  528.     fade_off();
  529.  
  530.     // Borra la pantalla y cualquier texto que hubiera
  531.     clear_screen();
  532.     delete_text(all_text);
  533.  
  534. END
  535.  
  536. //-----------------------------------------------------------------------------
  537. // Proceso piensa
  538. // Inteligencia del juego, decide que piezas mover en cada jugada
  539. // Entradas: profundidad  = Numero de profundidades a mirar
  540. //           lado  = Que jugador es el que se mueve
  541. //           nivel = Nivel de profundidad donde se esta en este momento
  542. //-----------------------------------------------------------------------------
  543.  
  544. PROCESS piensa(profundidad,lado,nivel)
  545.  
  546. BEGIN
  547.     // Reinicializa las variable de número de casillas y la de número movimientos
  548.     num_casilla=0; num_mov=0;
  549.  
  550.     // Mira que lado es el que se mueve
  551.     IF (lado==1)    // Mueve el lado del jugador
  552.         // Comprueba una a una todas las casillas
  553.         FROM num_casilla=0 TO 35;
  554.             // Comprueba las columnas 0 a 3 de cada fila
  555.             IF (num_casilla MOD 6<4)
  556.                 // Si se tiene en la casilla un pieza a la derecha una contraria
  557.                 // y detras de ella un espacio (OX.) (O->propia X->contraria .-> vacia)
  558.                 IF (tablero[num_casilla+1]==2 AND tablero[num_casilla]==1 AND tablero[num_casilla+2]==0)
  559.                     // Guarda movimiento de comer
  560.                     tmovimientos[num_mov]=num_casilla;          // Guarda posicion donde esta la pieza
  561.                     tmovimientos[num_mov+1]=num_casilla+2;      // Guarda posicion de donde va a ir
  562.  
  563.                     // Y guarda la puntuacion que es igual a la puntuacion de la
  564.                     // casilla donde esta menos la puntuacion de la casilla donde va
  565.                     // mas la puntuacion de la casilla de la pieza que se va a comer
  566.                     // mas cincuenta puntos porque se esta comiendo
  567.                     tmovimientos[num_mov+2]=estrategia1[num_casilla+2]-estrategia1[num_casilla]+estrategia2[num_casilla+1]+50;
  568.  
  569.                     // E incrementa el numero de movimientos en 1 (por 3 datos)
  570.                     num_mov=num_mov+3;
  571.                 END
  572.  
  573.                 // Comprueba si esta casilla esta vacia la de la derecha tiene
  574.                 // una pieza contraria y detras de ella una pieza propia (.XO)
  575.                 IF (tablero[num_casilla+1]==2 AND tablero[num_casilla+2]==1 AND tablero[num_casilla]==0)
  576.  
  577.                     // Si se cumple guarda el movimiento de igual manera que antes
  578.                     tmovimientos[num_mov]=num_casilla+2;
  579.                     tmovimientos[num_mov+1]=num_casilla;
  580.                     tmovimientos[num_mov+2]=estrategia1[num_casilla]-estrategia1[num_casilla+2]+estrategia2[num_casilla+1]+50;
  581.                     num_mov=num_mov+3;
  582.                 END
  583.             END
  584.  
  585.             // Mira las filas 0 a 3 de cada columna
  586.             IF (num_casilla<24)
  587.  
  588.                 // Comprueba si esta casilla se tiene una pieza, si en la de abajo
  589.                 // hay una pieza contraria y debajo esta vacio
  590.                 IF (tablero[num_casilla+6]==2 AND tablero[num_casilla]==1 AND tablero[num_casilla+12]==0)
  591.  
  592.                     // Y guarda la puntuacion de movimiento como se guardaba arriba
  593.                     tmovimientos[num_mov]=num_casilla;
  594.                     tmovimientos[num_mov+1]=num_casilla+12;
  595.                     tmovimientos[num_mov+2]=estrategia1[num_casilla+12]-estrategia1[num_casilla]+estrategia2[num_casilla+6]+50;
  596.                     num_mov=num_mov+3;
  597.                 END
  598.  
  599.                 // Comprueba si esta casilla esta vacia, si la de encima esta ocupada
  600.                 // por una ficha contraria, y encima de ella hay una pieza propia
  601.                 IF (tablero[num_casilla+6]==2 AND tablero[num_casilla+12]==1 AND tablero[num_casilla]==0)
  602.  
  603.                     // Guarda la puntuacion del movimiento como en los casos anteriores
  604.                     tmovimientos[num_mov]=num_casilla+12;
  605.                     tmovimientos[num_mov+1]=num_casilla;
  606.                     tmovimientos[num_mov+2]=estrategia1[num_casilla]-estrategia1[num_casilla+12]+estrategia2[num_casilla+6]+50;
  607.                     num_mov=num_mov+3;
  608.                 END
  609.             END
  610.         END
  611.     ELSE
  612.         // Hace la misma comprobacion de comer fichas pero con el otro jugador
  613.         FROM num_casilla=0 TO 35;
  614.  
  615.             // Mira las columnas
  616.             IF (num_casilla MOD 6<4)
  617.                 IF (tablero[num_casilla+1]==1 AND tablero[num_casilla]==2 AND tablero[num_casilla+2]==0)
  618.  
  619.                     // Si come pone el movimiento con su puntuacion
  620.                     tmovimientos[num_mov]=num_casilla;
  621.                     tmovimientos[num_mov+1]=num_casilla+2;
  622.                     tmovimientos[num_mov+2]=estrategia2[num_casilla+2]-estrategia2[num_casilla]+estrategia1[num_casilla+1]+42;
  623.                     num_mov=num_mov+3;
  624.                 END
  625.                 IF (tablero[num_casilla+1]==1 AND tablero[num_casilla+2]==2 AND tablero[num_casilla]==0)
  626.  
  627.                     // Si come pone el movimiento con su puntuacion
  628.                     tmovimientos[num_mov]=num_casilla+2;
  629.                     tmovimientos[num_mov+1]=num_casilla;
  630.                     tmovimientos[num_mov+2]=estrategia2[num_casilla]-estrategia2[num_casilla+2]+estrategia1[num_casilla+1]+42;
  631.                     num_mov=num_mov+3;
  632.                 END
  633.             END
  634.             // Mira las filas
  635.             IF (num_casilla<24)
  636.                 IF (tablero[num_casilla+6]==1 AND tablero[num_casilla]==2 AND tablero[num_casilla+12]==0)
  637.  
  638.                     // Si come pone el movimiento con su puntuacion
  639.                     tmovimientos[num_mov]=num_casilla;
  640.                     tmovimientos[num_mov+1]=num_casilla+12;
  641.                     tmovimientos[num_mov+2]=estrategia2[num_casilla+12]-estrategia2[num_casilla]+estrategia1[num_casilla+6]+42;
  642.                     num_mov=num_mov+3;
  643.                 END
  644.                 IF (tablero[num_casilla+6]==1 AND tablero[num_casilla+12]==2 AND tablero[num_casilla]==0)
  645.  
  646.                     // Si come pone el movimiento con su puntuacion
  647.                     tmovimientos[num_mov]=num_casilla+12;
  648.                     tmovimientos[num_mov+1]=num_casilla;
  649.                     tmovimientos[num_mov+2]=estrategia2[num_casilla]-estrategia2[num_casilla+12]+estrategia1[num_casilla+6]+42;
  650.                     num_mov=num_mov+3;
  651.                 END
  652.             END
  653.         END
  654.     END
  655.     // Mira si hay que comer en este turno
  656.     IF (num_mov>0)
  657.  
  658.         // Si hay que comer reinicia contadores
  659.         mejor_movimiento=-1; contador_mov=2;
  660.  
  661.         // Busca si con algun movimiento llega al final y gana
  662.         REPEAT
  663.             IF (tmovimientos[contador_mov]>1000) mejor_movimiento=contador_mov-2; END
  664.         UNTIL ((contador_mov+=3)>num_mov)
  665.  
  666.         // Si ha encontrado algun movimiento
  667.         IF (mejor_movimiento>=0)
  668.  
  669.             // Guarda la puntuacion del movimiento
  670.             puntuación=tmovimientos[mejor_movimiento+2];
  671.  
  672.             // Y si el nivel de pensamiento es el primero (siguiente jugada)
  673.             IF (nivel==1)
  674.  
  675.                 // Guarda el movimiento para que lo de salida
  676.                 que_pieza=tmovimientos[mejor_movimiento];
  677.                 mover=tmovimientos[mejor_movimiento+1];
  678.                 mueve=mueve XOR 3;
  679.             END
  680.         ELSE    // Si no hay ningun movimiento con que ganar en la siguiente jugada
  681.  
  682.             // Si hay mas de un movimiento o no esta en el primer nivel de pensamiento
  683.             IF (num_mov>3 OR nivel>1)
  684.                 contador_mov=0;
  685.                 REPEAT  // Repite hasta que no haya movimientos
  686.  
  687.                     // Come la ficha para poder pensar otro nivel
  688.                     tablero[tmovimientos[contador_mov]]=0;
  689.                     tablero[tmovimientos[contador_mov+1]]=lado;
  690.                     tablero[(tmovimientos[contador_mov]+tmovimientos[contador_mov+1])/2]=0;
  691.  
  692.                     // Piensa al movimiento del otro lado (XOR 3)
  693.                     piensa(profundidad,lado XOR 3,nivel+1);
  694.  
  695.                     // Resta la puntuacion obtenida a la actual
  696.                     tmovimientos[contador_mov+2]=tmovimientos[contador_mov+2]-puntuación;
  697.  
  698.                     // Devuelve la ficha a su posicion antigua
  699.                     tablero[tmovimientos[contador_mov]]=lado;
  700.                     tablero[tmovimientos[contador_mov+1]]=0;
  701.                     tablero[(tmovimientos[contador_mov]+tmovimientos[contador_mov+1])/2]=lado XOR 3;
  702.                 UNTIL ((contador_mov+=3)==num_mov)
  703.             END
  704.  
  705.             // Reinicia las variables para busca la mayor puntuacion
  706.             mejor_movimiento=0;
  707.             puntuación=tmovimientos[2];
  708.             contador_mov=2;
  709.  
  710.             // Busca la mayor puntuacion de los movimientos de comer
  711.             WHILE ((contador_mov+=3)<num_mov)
  712.                 IF (tmovimientos[contador_mov]>puntuación)
  713.                     mejor_movimiento=contador_mov-2;
  714.                     puntuación=tmovimientos[contador_mov];
  715.                 END
  716.             END
  717.  
  718.             // Si es el primer nivel de pensamiento guarda los valores
  719.             // para poder comer cuando salga de la rutina
  720.             IF (nivel==1)
  721.                 que_pieza=tmovimientos[mejor_movimiento];
  722.                 mover=tmovimientos[mejor_movimiento+1];
  723.                 mueve=mueve XOR 3;
  724.             END
  725.         END
  726.     ELSE // No hay que comer en este turno, rellena movimientos con su puntuacion
  727.  
  728.         // Reinicializa las variables para mirar las piezas
  729.         num_piezas=0; //Nº de piezas
  730.         num_mov=0;
  731.  
  732.         // Mira que lado de las piezas es el que mueve
  733.         IF (lado==1)
  734.  
  735.             // Va mirando una por una todas las casillas
  736.             FROM num_casilla=0 TO 35;
  737.                 columna_tablero=num_casilla MOD 6;   // Coge la columna
  738.  
  739.                 // Si hay una pieza en esa casilla
  740.                 IF (tablero[num_casilla]==1)
  741.  
  742.                     // Incrementa el num_casilla de piezas
  743.                     num_piezas=num_piezas+1;
  744.  
  745.                     // Si esta entre las columnas 1 a 5 y la casilla
  746.                     // de la derecha esta vacia guarda el movimiento
  747.                     IF (columna_tablero>0 AND tablero[num_casilla-1]==0)
  748.  
  749.                         // Guarda el movimiento en la tabla
  750.                         tmovimientos[num_mov]=num_casilla;      // Posicion en la que esta
  751.                         tmovimientos[num_mov+1]=num_casilla-1;  // Posicion donde se va a mover
  752.  
  753.                         // Guarda la puntuacion que es igual a la puntuacion de
  754.                         // casilla a donde va menos la puntuacion de donde esta
  755.                         tmovimientos[num_mov+2]=estrategia1[num_casilla-1]-estrategia1[num_casilla];
  756.  
  757.                         // Incrementa el numero de movimientos
  758.                         num_mov=num_mov+3;
  759.                     END
  760.                     // Mira si la ficha encontrada esta entre las filas de 1 a 5
  761.                     IF (num_casilla>=6)
  762.  
  763.                         // Y si la casilla de arriba esta vacia
  764.                         IF(tablero[num_casilla-6]==0)
  765.  
  766.                             // Guarda el movimiento igual que lo ha guardado arriba
  767.                             tmovimientos[num_mov]=num_casilla;
  768.                             tmovimientos[num_mov+1]=num_casilla-6;
  769.                             tmovimientos[num_mov+2]=estrategia1[num_casilla-6]-estrategia1[num_casilla];
  770.                             num_mov=num_mov+3;
  771.                         END
  772.                     END
  773.                 ELSE
  774.  
  775.                     // Si hay una pieza contraria, suma el numero de piezas
  776.                     IF(tablero[num_casilla]==2)
  777.                         num_piezas=num_piezas+1;
  778.                     END
  779.                 END
  780.             END
  781.         ELSE    // Si no esta moviendose las otras piezas
  782.  
  783.             // Hace el mismo proceso de arriba pero con las otras piezas
  784.             FROM num_casilla=0 TO 35;
  785.                 columna_tablero=num_casilla MOD 6;
  786.                 IF (tablero[num_casilla]==2)
  787.                     num_piezas=num_piezas+1;
  788.                     IF (num_casilla<35)
  789.                         IF (columna_tablero<5 AND tablero[num_casilla+1]==0)
  790.                             tmovimientos[num_mov]=num_casilla;
  791.                             tmovimientos[num_mov+1]=num_casilla+1;
  792.                             tmovimientos[num_mov+2]=estrategia2[num_casilla+1]-estrategia2[num_casilla];
  793.                             num_mov=num_mov+3;
  794.                         END
  795.                     END
  796.                     IF (num_casilla<30)
  797.                         IF(tablero[num_casilla+6]==0)
  798.                             tmovimientos[num_mov]=num_casilla;
  799.                             tmovimientos[num_mov+1]=num_casilla+6;
  800.                             tmovimientos[num_mov+2]=estrategia2[num_casilla+6]-estrategia2[num_casilla];
  801.                             num_mov=num_mov+3;
  802.                         END
  803.                     END
  804.                 ELSE
  805.                     IF(tablero[num_casilla]==1)
  806.                         num_piezas=num_piezas+1;
  807.                     END
  808.                 END
  809.             END
  810.         END
  811.  
  812.         // Si no se ha encontrado ningun movimiento
  813.         IF (num_mov==0)
  814.  
  815.             // Si es el primer nivel de pensar
  816.             IF (nivel==1)
  817.                 que_pieza=36;       // La rutina devuelve ningun movimiento permitido
  818.             ELSE                    // Si esta en otro nivel de pensamiento
  819.                 puntuación=-2048;   // Devuelve una puntuacion muy mala
  820.             END
  821.         ELSE                        // Si hay movimientos posibles
  822.  
  823.             // Reinicia las variables para empezar a buscar
  824.             mejor_movimiento=-1;
  825.             contador_mov=2;
  826.  
  827.             // Comprueba si con algun movimiento se llega al final del juego
  828.             REPEAT
  829.                 IF (tmovimientos[contador_mov]>1000)
  830.                     mejor_movimiento=contador_mov-2;
  831.                 END
  832.             UNTIL ((contador_mov+=3)>num_mov)
  833.  
  834.             // Si hay algun movimiento con el que ganar
  835.             IF (mejor_movimiento>=0)
  836.                 // Guarda la puntuacion
  837.                 puntuación=tmovimientos[mejor_movimiento+2];
  838.                 // Y si esta en el primer nivel de pensamiento
  839.                 IF (nivel==1)
  840.                     // Guarda los valoresde salida de la rutina para asi
  841.                     // hacer ese movimiento en el proximo turno
  842.                     que_pieza=tmovimientos[mejor_movimiento];
  843.                     mover=tmovimientos[mejor_movimiento+1];
  844.                     mueve=mueve XOR 3;
  845.                 END
  846.             ELSE    // Si no tiene ningun moviento con el que ganar
  847.  
  848.                 // Si esta en el primer nivel de pensar
  849.                 IF (nivel==1)
  850.                     // Si quedan menos de 6 piezas en el tablero
  851.                     IF (num_piezas<6)
  852.                         profundidad=profundidad+2;          // Incrementa en dos el nivel de
  853.                                                             // profundidad de pensamiendo en 2
  854.                     ELSE
  855.                         // Si quedan menos de 8 piezas incrementa
  856.                         // el nivel de pensamiento en 1
  857.                         IF (num_piezas<8)
  858.                             profundidad=profundidad+1;
  859.                         END
  860.                     END
  861.                 END
  862.  
  863.                 // Mientras se tenga nivel de profundidad
  864.                 IF (profundidad>0)
  865.                     contador_mov=0;
  866.                     // Mira todos los movimientos posibles
  867.                     REPEAT
  868.                         // Realiza el movimiento
  869.                         tablero[tmovimientos[contador_mov]]=0;
  870.                         tablero[tmovimientos[contador_mov+1]]=lado;
  871.                         // Piensa la estrategia del oponente
  872.                         piensa(profundidad-1,lado XOR 3,nivel+1);
  873.                         // Resta la puntuacion del oponente
  874.                         tmovimientos[contador_mov+2]=tmovimientos[contador_mov+2]-puntuación;
  875.                         // Restablece el tablero a la posicion de antes de pensar
  876.                         tablero[tmovimientos[contador_mov]]=lado;
  877.                         tablero[tmovimientos[contador_mov+1]]=0;
  878.                     UNTIL ((contador_mov=contador_mov+3)==num_mov)
  879.                 END
  880.  
  881.                 // Pone las variables a cero para buscar el mejor movimiento
  882.                 mejor_movimiento=0;
  883.                 puntuación=tmovimientos[2];
  884.                 contador_mov=2;
  885.  
  886.                 // Repite mientras haya movimientos
  887.                 WHILE ((contador_mov+=3)<num_mov)
  888.                     // Si este movimiento es mejor que el ultimo, guardalo
  889.                     IF (tmovimientos[contador_mov]>puntuación)
  890.                         mejor_movimiento=contador_mov-2;
  891.                         puntuación=tmovimientos[contador_mov];
  892.                     END
  893.                 END
  894.  
  895.                 // Si es el primer nivel de pensamiento
  896.                 IF (nivel==1)
  897.                     // Guarda los datos de salida de la rutina
  898.                     que_pieza=tmovimientos[mejor_movimiento];
  899.                     mover=tmovimientos[mejor_movimiento+1];
  900.                     mueve=mueve XOR 3;
  901.                 END
  902.             END
  903.         END
  904.     END
  905. END
  906.  
  907. //-----------------------------------------------------------------------------
  908. // Proceso piezas
  909. // Proceso que crea las piezas
  910. //-----------------------------------------------------------------------------
  911.  
  912. PROCESS piezas()
  913.  
  914. PRIVATE
  915.     x_seleccionada,y_seleccionada;     // Para determinar que pieza se selecciona con el ratón
  916.     seleccion_raton;
  917.  
  918. BEGIN
  919.  
  920.     // Se calcula que pieza est  seleccionada por el ratón
  921.     // Calculas la columna y fila del tablero
  922.     y_seleccionada=-(mouse.x*265/10-46*(mouse.y+17)-2438)/2438;
  923.     x_seleccionada=(mouse.x*265/10+46*(mouse.y-300))/2438;
  924.  
  925.     // Calcula el numero de casilla
  926.     seleccion_raton=y_seleccionada*6+x_seleccionada;
  927.  
  928.     // Pone a cero las variables para hallar
  929.     seleccionada=36;
  930.     contador_mov=0;
  931.  
  932.     // Si no hay pieza seleccionada
  933.     IF (que_pieza==36)
  934.         // Busca en todos los movimientos posibles
  935.         WHILE (contador_mov<father.num_mov)
  936.             // Si hay alguno en la posicion que señala el raton
  937.             IF (father.tmovimientos[contador_mov]==seleccion_raton)
  938.                 // Y si hay, la coge como seleccionada
  939.                 seleccionada=seleccion_raton;
  940.             END
  941.             contador_mov+=3;
  942.         END
  943.     ELSE    // Si hay alguna pieza seleccionada
  944.             // Mira en todos los movimientos posibles
  945.         WHILE (contador_mov<father.num_mov)
  946.  
  947.             // Si el raton esta señalando a donde se pueda mover
  948.             IF (father.tmovimientos[contador_mov]==que_pieza AND
  949.                 father.tmovimientos[contador_mov+1]==seleccion_raton)
  950.                 // Y elige esa pieza como seleccion
  951.                 seleccionada=seleccion_raton;
  952.             END
  953.             contador_mov+=3;
  954.         END
  955.     END
  956.  
  957.     FROM contador_filas=0 TO 5;         // Recorre todas las filas
  958.         FROM contador_columna=0 to 5;   // Recorre todas las columnas
  959.             // Si esa casilla esta seleccionada
  960.             IF (contador_filas*6+contador_columna==seleccionada)
  961.                 // Si en esa casilla hay una pieza
  962.                 IF (tablero[contador_filas*6+contador_columna]!=0)
  963.                     // Pone el grafico trasparente de esa pieza
  964.                     pieza(320+(contador_columna-contador_filas)*46,124+(contador_columna+contador_filas)*265/10,tablero[contador_filas*6+contador_columna] XOR color,4);
  965.                 ELSE    // Si no hay pieza
  966.                         // Si no, es un movimiento y pone una piza trasparente
  967.                     IF (que_pieza<36)
  968.                         // Pone el grafico transparente en el lugar donde va a mover
  969.                         pieza(320+(contador_columna-contador_filas)*46,124+(contador_columna+contador_filas)*265/10,mueve XOR color XOR 3,4);
  970.                     END
  971.                 END
  972.             ELSE        // Si no hay piezas seleccionada en esa casilla
  973.  
  974.                 // Si es la pieza que se esta moviendo y toca imprimirla por el parpadeo
  975.                 IF (contador_filas*6+contador_columna==que_pieza AND parpadeo)
  976.                     // Pone la pieza transparente
  977.                     pieza(320+(contador_columna-contador_filas)*46,124+(contador_columna+contador_filas)*265/10,tablero[contador_filas*6+contador_columna] XOR color,4);
  978.                 ELSE
  979.                     // Si no, si hay pieza
  980.                     IF (tablero[contador_filas*6+contador_columna]!=0)
  981.                         // Imprime una pieza normal
  982.                         pieza(320+(contador_columna-contador_filas)*46,124+(contador_columna+contador_filas)*265/10,tablero[contador_filas*6+contador_columna] XOR color,0);
  983.                     END
  984.                 END
  985.             END
  986.         END
  987.     END
  988.     LOOP FRAME; END
  989. END
  990.  
  991. //-----------------------------------------------------------------------------
  992. // Proceso pieza
  993. // Pone el grafico de las piezas
  994. //-----------------------------------------------------------------------------
  995.  
  996. PROCESS pieza(x,y,graph,flags)
  997.  
  998. BEGIN
  999.   LOOP FRAME; END
  1000. END
  1001.  
  1002. //-----------------------------------------------------------------------------
  1003. // Proceso pon_nivel
  1004. // Carga la posicion de las piezas de cada nivel
  1005. //-----------------------------------------------------------------------------
  1006.  
  1007. PROCESS pon_nivel(n_nivel)
  1008.  
  1009. BEGIN
  1010.     FROM num_casilla=0 TO 35;
  1011.         tablero[num_casilla]=niveles[num_casilla+(n_nivel*36)];
  1012.     END
  1013. END
  1014.  
  1015. //-----------------------------------------------------------------------------
  1016. // Proceso movimiento
  1017. // Hace el movimiento de la pieza
  1018. //-----------------------------------------------------------------------------
  1019.  
  1020. PROCESS movimiento()
  1021.  
  1022. PRIVATE
  1023.     x1,y1;          // Desde donde se realiza el movimiento
  1024.     x2,y2;          // Hasta donde se realiza el movimiento
  1025.  
  1026. BEGIN
  1027.     mouse.graph=0;  // Quita el grafico del raton
  1028.  
  1029.     // Destruye las piezas viejas
  1030.     signal(id_piezas,s_kill_tree);
  1031.  
  1032.     // Inicializa los contadores
  1033.     tipo_movimiento=mover-que_pieza;   // Tipo de movimiento
  1034.     tipo_pieza=tablero[que_pieza];     // Tipo de pieza
  1035.  
  1036.     // Comprueba si es un movimiento de comer
  1037.     IF (tipo_movimiento==2 OR tipo_movimiento==-2 OR tipo_movimiento==12 OR tipo_movimiento==-12)
  1038.         // Y quita la pieza que se ha comido del tablero
  1039.         tablero[(que_pieza+mover)/2]=0;
  1040.     END
  1041.     tablero[mover]=3;
  1042.     tablero[que_pieza]=0;
  1043.  
  1044.     // Coge las coordenadas de tablero de donde esta la pieza
  1045.     fila_pieza=que_pieza/6;      // Fila
  1046.     columna_pieza=que_pieza MOD 6;  // Columna
  1047.  
  1048.     // Halla las coordenadas en pantalla
  1049.     x1=320+(columna_pieza-fila_pieza)*46;
  1050.     y1=124+(columna_pieza+fila_pieza)*265/10;
  1051.  
  1052.     // Coge las coordenadas de tablero de la posicion a donde se mueve
  1053.     fila_pieza=mover/6;
  1054.     columna_pieza=mover MOD 6;
  1055.  
  1056.     // Y hallas las coordenadas en pantalla
  1057.     x2=320+(columna_pieza-fila_pieza)*46;
  1058.     y2=124+(columna_pieza+fila_pieza)*265/10;
  1059.  
  1060.     // Comprueba si el movimiento es horizontal
  1061.     IF (tipo_movimiento==2 OR tipo_movimiento==-2 OR tipo_movimiento==1 OR tipo_movimiento==-1)
  1062.  
  1063.         // Hace el movimiento en 12 partes
  1064.         FROM inc_desplazamiento=0 TO 11;
  1065.  
  1066.             // Recorre las filas del tablero
  1067.             FROM contador_filas=0 TO 5;
  1068.  
  1069.                 // Recorre las columnas del tablero
  1070.                 FROM contador_columna=0 TO 5;
  1071.  
  1072.                     // Comprueba que la casilla no este vacia
  1073.                     IF (tablero[contador_filas*6+contador_columna]!=0)
  1074.  
  1075.                         // Mira si es una pieza normal
  1076.                         IF (tablero[contador_filas*6+contador_columna]!=3)
  1077.                             // Y la imprime
  1078.                             pieza(320+(contador_columna-contador_filas)*46,124+(contador_columna+contador_filas)*265/10,tablero[contador_filas*6+contador_columna] XOR color,0);
  1079.                         ELSE    // O es la pieza que se esta movimiento
  1080.                             // Tambien se imprime pero con el incremento del movimiento
  1081.                             pieza((x1*(11-inc_desplazamiento)+x2*inc_desplazamiento)/11,(y1*(11-inc_desplazamiento)+y2*inc_desplazamiento)/11,tipo_pieza XOR color,0);
  1082.                         END
  1083.                     END
  1084.                 END
  1085.             END
  1086.             FRAME;
  1087.  
  1088.             // Despues de imprimirlas, borra las piezas
  1089.             signal(id,s_kill_tree);
  1090.             signal(id,s_wakeup);
  1091.         END
  1092.     ELSE    // Si no, es un movimiento vertical
  1093.             // Hace el mismo proceso que el indicado arriba
  1094.         FROM inc_desplazamiento=0 TO 11;
  1095.             FROM contador_columna=0 TO 5;
  1096.                 FROM contador_filas=0 TO 5;
  1097.                     IF (tablero[contador_filas*6+contador_columna]!=0)
  1098.                         IF (tablero[contador_filas*6+contador_columna]!=3)
  1099.                             pieza(320+(contador_columna-contador_filas)*46,124+(contador_columna+contador_filas)*265/10,tablero[contador_filas*6+contador_columna] XOR color,0);
  1100.                         ELSE
  1101.                             pieza((x1*(11-inc_desplazamiento)+x2*inc_desplazamiento)/11,(y1*(11-inc_desplazamiento)+y2*inc_desplazamiento)/11,tipo_pieza XOR color,0);
  1102.                         END
  1103.                     END
  1104.                 END
  1105.             END
  1106.             FRAME;
  1107.             signal(id,s_kill_tree);
  1108.             signal(id,s_wakeup);
  1109.         END
  1110.     END
  1111.  
  1112.     // Pone en la nueva posicion la pieza
  1113.     tablero[mover]=tipo_pieza;
  1114.  
  1115.     // Guarda el identificador para luego eliminar el proceso
  1116.     id_piezas=id;
  1117.  
  1118.     // Imprime el tablero como haya quedado
  1119.     FROM contador_filas=0 TO 5;
  1120.         FROM contador_columna=0 TO 5;
  1121.             IF (tablero[contador_filas*6+contador_columna]!=0)
  1122.                 pieza(320+(contador_columna-contador_filas)*46,124+(contador_columna+contador_filas)*265/10,tablero[contador_filas*6+contador_columna] XOR color,0);
  1123.             END
  1124.         END
  1125.     END
  1126.     LOOP FRAME; END
  1127. END
  1128.